<html>
  <head>
    <title>自动异常处理</title>
  </head>
  <body>
    <script>
      // 异常处理  Exception Handling  

                /*
                    ABP 提供了一个内置的基础设施，并提供了一个处理异常的标准模型。

                        ABP自动处理所有异常，并向客户端发送"标准格式的错误消息"以获取API/AJAX请求。

                        自动隐藏内部基础架构错误，并返回标准错误信息。

                        提供一种简单且可配置的方法来"本地化异常消息"

                        自动将"标准异常"映射到 Http状态码，并提供可配置的选项来"映射自定义异常"
                */

                /*
                    一、自动异常处理

                        1、进行异常处理的条件

                                AbpExceptionFilter 如果满足以下任何条件，则处理异常：

                                    ①、 控制器操作引发异常，该操作返回对象结果(不是视图结果);

                                    ②、 该请求是一个Ajax请求 （X-Requested-With Http标头值为 XMLHttpRequest）

                                    ③、 客户端显式接受application/json内容类型（通过acceptHTTP标头）。

                                如果处理了异常，它会自动记录并将格式化的JSON消息返回给客户端。

                        2、错误消息格式
                                
                                    错误消息是 "RemoteServiceErrorResponse" 类的一个实例。
                                    
                                    最简单的错误JSON只有一个消息属性，如下所示：

                                    {
                                        "error": {
                                            "message": "This topic is locked and can not add a new message"
                                        }
                                    }

                                    "可选字段" 可以根据发生的异常来填充、

                                   ①、 错误代码 ErrorCode
                                          Errorcode是异常的可选且唯一的字符串值。

                                          抛出的Exception应实现IHasErrorCode接口来填充此字段。示例JSON值：

                                                {
                                                    "error": {
                                                        "code": "App:010042",
                                                        "message": "This topic is locked and can not add a new message"
                                                    }
                                                }

                                    ②、错误详情 Error Details
                                            错误详情在Json错误消息的可选字段中。
                                            抛出Exception应该实现 IHasErrorDetails接口来填充此字段：
                                                {
                                                    "error": {
                                                        "code": "App:010042",
                                                        "message": "This topic is locked and can not add a new message",
                                                        "details": "A more detailed info about the error..."
                                                    }
                                                }

                                    ③、验证错误
                                            如果抛出的异常实现了IHasValidationErrors接口，则会填充一个标准字段。
                                                {
                                                    "error": {
                                                        "code": "App:010046",
                                                        "message": "Your request is not valid, please correct and try again!",
                                                        "validationErrors": [{
                                                        "message": "Username should be minimum length of 3.",
                                                        "members": ["userName"]
                                                        },
                                                        {
                                                        "message": "Password is required",
                                                        "members": ["password"]
                                                        }]
                                                    }
                                                }

                                              AbpValidationException实现了IHasValidationErrors接口，当请求输入无效时，框架会自动抛出它。
                                              所以，通常你不需要处理验证错误，除非你有高度定制的验证逻辑。
                */
    </script>
  </body>
</html>